home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Varios Español
/
Varios Español.iso
/
CLIPP52
/
TCBLLIB1.ZIP
/
IGETIMG.PRG
< prev
next >
Wrap
Text File
|
1993-11-29
|
19KB
|
459 lines
/***
*
* iGetImg.prg
*
* Illustration of gets and images with Light Lib Images.
*
* Copyright (c) 1993, DFL.
* All rights reserved.
*
*/
#include "Inkey.ch"
#include "llibi.ch" // Use Light Lib Images defines
#include "llibitoo.ch" // Use Light Lib Images tools defines
#include "llibg.ch" // Use Light Lib Graphics defines
#include "llibgtoo.ch" // Use Light Lib Graphics tools defines
FIELD NAME,FIRSTNAME,SIZE,BIRTDATE,EYES,HAIR,ADDR1,ADDR2,CITY,STATE,COUNTRY,ZIP,PHONE,IMAGE016,IMAGE256
MEMVAR GetList
STATIC lIs256Color := .F. // Manage 16 and 256 colors monitors
*
FUNCTION GetImage()
LOCAL nTop := 06
LOCAL nLeft := 02
LOCAL nBottom := 24
LOCAL nRight := 75
LOCAL nKey // Keystroke
LOCAL lMore := .T. // Loop control
LOCAL aWinButtons := {} // Arrays to handle buttons
LOCAL aVertScroll := {} // and scrolls bars
LOCAL aHoriScroll := {} //
LOCAL aGetButtons := {} // Arrays to handle gets buttons
// General savings
LOCAL xScreen := SAVESCREEN( nTop, nLeft, nBottom, nRight)
LOCAL cColorSave := SETCOLOR("N/W,W+/B,,G,W+/N")
LOCAL nCursoSave := SETCURSOR(0)
// Browse pseudo object
LOCAL oBrowseImg := ARRAY(BROWSE_IMG_SIZE)
oBrowseImg:lIsStable := .F.
oBrowseImg:nCurrentX := 0
oBrowseImg:nCurrentY := 0
oBrowseImg:nScaleX := 0
oBrowseImg:nScaleY := 0
// No image loaded, ptr are empty
oBrowseImg:aOriPtr := {}
oBrowseImg:aDisPtr := {}
// Compute display window pixels values
oBrowseImg:nWinDispX1 := FONT_SIZE_X * ( nRight - 18 + 2 )
oBrowseImg:nWinDispY1 := FONT_SIZE_Y * ( nTop + 3 + 3 )
oBrowseImg:nWinDispX2 := FONT_SIZE_X * ( nRight - 2 - 3 ) - 1
oBrowseImg:nWinDispY2 := FONT_SIZE_Y * ( nTop + 15 - 1 ) - 1
oBrowseImg:nWinDispWidth := oBrowseImg:nWinDispX2 - oBrowseImg:nWinDispX1 + 1
oBrowseImg:nWinDispHeight := oBrowseImg:nWinDispY2 - oBrowseImg:nWinDispY1 + 1
// Fill the images to be browsed
oBrowseImg:aImgAvail := {}
oBrowseImg:nImgInUse := 0
// Set the block to standard apply key
oBrowseImg:bApplyKey := { |oBrowse,nKey| ImgApplyKey( oBrowse, nKey ) }
oBrowseImg:aUdfShort := { { | nStatus , nCall | lImgGauge( nStatus , nCall, .F., oBrowseImg ) } , 10 }
oBrowseImg:aUdfLong := { { | nStatus , nCall | lImgGauge( nStatus , nCall, .T., oBrowseImg ) } , 20 }
// -LLIBG- Display 3D box
DISPBOX(nTop,nLeft,nBottom,nRight,LLG_BOX_GRAY_SQUARE)
// -LLIBG- Display 3D box
gFrame(oBrowseImg:nWinDispX1 - 4 ,;
oBrowseImg:nWinDispY1 - 4 ,;
oBrowseImg:nWinDispX2 + FONT_SIZE_X * 2 + 4 ,;
oBrowseImg:nWinDispY2 + FONT_SIZE_Y + 4 ,;
7,15,8,4,4,4,4 ;
)
// Set gauge function
iSet( LLI_SET_UDF , oBrowseImg:aUdfShort )
// Open database
USE ('People.Dbf') NEW
// Create GETS
CreateGets(nTop+4,nLeft+4,aGetButtons)
lIs256Color := gMode()[LLG_MODE_COLOR_MAX]==256
// Load first image
lLoadImgFile( oBrowseImg , ALLTRIM(IF(lIs256Color,IMAGE256,IMAGE016))+'.BMP' )
// -LLIBG- Add vertical scroll bar
@ (nRight-5)*FONT_SIZE_X ,;
(nTop+6)*FONT_SIZE_Y ,;
(nRight-3)*FONT_SIZE_X ,;
(nTop+14)*FONT_SIZE_Y ;
SCROLLBAR ;
STYLE BUTTON_TYPE_SCROLL_VERT ;
ACTIONUP { || NIL } ;
ACTIONDN { || NIL } ;
ACTIONBAR { |nSens,nPercent| ImageVertBar(nSens,nPercent,oBrowseImg) } ;
HANDLE aVertScroll ;
ATTACH aWinButtons
// -LLIBG- Add horizontal scroll bar
@ (nRight-16)*FONT_SIZE_X ,;
(nTop+14)*FONT_SIZE_Y ,;
(nRight-5)*FONT_SIZE_X ,;
(nTop+15)*FONT_SIZE_Y ;
SCROLLBAR ;
STYLE BUTTON_TYPE_SCROLL_HORI ;
ACTIONUP { || NIL } ;
ACTIONDN { || NIL } ;
ACTIONBAR { |nSens,nPercent| ImageHoriBar(nSens,nPercent,oBrowseImg) } ;
HANDLE aHoriScroll ;
ATTACH aWinButtons
// Add a close window button
@ nLeft*FONT_SIZE_X ,;
nTop *FONT_SIZE_Y ,,;
BUTTON ;
STYLE BUTTON_TYPE_KEY ;
ACTION K_ESC ;
DISPLAYUP gBmpLoad("CLOSEWIN.BMU") ;
DISPLAYDN gBmpLoad("CLOSEWIN.BMD") ;
ATTACH aWinButtons
// -LLIBG- Add an icon bar
// -LLIBG- Add a button to allow user
// to quit
@ (nLeft+2 )*FONT_SIZE_X ,;
(nTop+1 )*FONT_SIZE_Y ,,;
BUTTON ;
STYLE BUTTON_TYPE_KEY ;
ACTION K_ESC ;
ACCELERATOR "Q" ;
DISPLAYUP gBmpLoad("QUIT.BMU") ;
DISPLAYDN gBmpLoad("QUIT.BMD") ;
ATTACH aWinButtons
// -LLIBG- Add a button go top of file
@ ATAIL(aWinButton)[BUTTON_RIGHT]+1 ,;
ATAIL(aWinButton)[BUTTON_TOP] ,,;
BUTTON ;
STYLE BUTTON_TYPE_RELEASE ;
ACTION { || Skipper(K_HOME,oBrowseImg,aGetButtons) } ;
ACCELERATOR K_ALT_H ;
DISPLAYUP gBmpLoad("GOBEG.BMU") ;
DISPLAYDN gBmpLoad("GOBEG.BMD") ;
ATTACH aWinButtons
// -LLIBG- Add a button skip backward
@ ATAIL(aWinButton)[BUTTON_RIGHT]+1 ,;
ATAIL(aWinButton)[BUTTON_TOP] ,,;
BUTTON ;
STYLE BUTTON_TYPE_RELEASE ;
ACTION { || Skipper(K_UP,oBrowseImg,aGetButtons) } ;
ACCELERATOR K_ALT_P ;
DISPLAYUP gBmpLoad("GOBAK.BMU") ;
DISPLAYDN gBmpLoad("GOBAK.BMD") ;
ATTACH aWinButtons
// -LLIBG- Add a button change values
@ ATAIL(aWinButton)[BUTTON_RIGHT]+1 ,;
ATAIL(aWinButton)[BUTTON_TOP] ,,;
BUTTON ;
STYLE BUTTON_TYPE_RELEASE ;
ACTION { || ReadGets(aGetButtons) } ;
ACCELERATOR K_ALT_C ;
DISPLAYUP gBmpLoad("CHANGE.BMU") ;
DISPLAYDN gBmpLoad("CHANGE.BMD") ;
ATTACH aWinButtons
// -LLIBG- Add a button skip formward
@ ATAIL(aWinButton)[BUTTON_RIGHT]+1 ,;
ATAIL(aWinButton)[BUTTON_TOP] ,,;
BUTTON ;
STYLE BUTTON_TYPE_RELEASE ;
ACTION { || Skipper(K_DOWN,oBrowseImg,aGetButtons) } ;
ACCELERATOR K_ALT_N ;
DISPLAYUP gBmpLoad("GOFOR.BMU") ;
DISPLAYDN gBmpLoad("GOFOR.BMD") ;
ATTACH aWinButtons
// -LLIBG- Add a button bottom of file
@ ATAIL(aWinButton)[BUTTON_RIGHT]+1 ,;
ATAIL(aWinButton)[BUTTON_TOP] ,,;
BUTTON ;
STYLE BUTTON_TYPE_RELEASE ;
ACTION { || Skipper(K_END,oBrowseImg,aGetButtons) } ;
ACCELERATOR K_ALT_E ;
DISPLAYUP gBmpLoad("GOEND.BMU") ;
DISPLAYDN gBmpLoad("GOEND.BMD") ;
ATTACH aWinButtons
// -LLIBG- Add a button go fit image into
// the window
@ ATAIL(aWinButton)[BUTTON_RIGHT]+1 ,;
ATAIL(aWinButton)[BUTTON_TOP] ,,;
BUTTON ;
STYLE BUTTON_TYPE_RELEASE ;
ACTION { || ImgZoom(ASC('/'),oBrowseImg) } ;
ACCELERATOR "/" ;
DISPLAYUP gBmpLoad("SMALEST.BMU") ;
DISPLAYDN gBmpLoad("SMALEST.BMD") ;
ATTACH aWinButtons
// -LLIBG- Add a button to zoom a part of
// the image
@ ATAIL(aWinButton)[BUTTON_RIGHT]+1 ,;
ATAIL(aWinButton)[BUTTON_TOP] ,,;
BUTTON ;
STYLE BUTTON_TYPE_RELEASE ;
ACTION { || ImgZoom(ASC('°'),oBrowseImg) } ;
ACCELERATOR "°" ;
DISPLAYUP gBmpLoad("AREA.BMU") ;
DISPLAYDN gBmpLoad("AREA.BMD") ;
ATTACH aWinButtons
// -LLIBG- Add a button to rotate to the right
// the image
@ ATAIL(aWinButton)[BUTTON_RIGHT]+1 ,;
ATAIL(aWinButton)[BUTTON_TOP] ,,;
BUTTON ;
STYLE BUTTON_TYPE_RELEASE ;
ACTION { || ImgRotate(90,oBrowseImg) } ;
ACCELERATOR "9" ;
DISPLAYUP gBmpLoad("ROTAT090.BMU") ;
DISPLAYDN gBmpLoad("ROTAT090.BMD") ;
ATTACH aWinButtons
// -LLIBG- Add a button to flip the image upside
// down
@ ATAIL(aWinButton)[BUTTON_RIGHT]+1 ,;
ATAIL(aWinButton)[BUTTON_TOP] ,,;
BUTTON ;
STYLE BUTTON_TYPE_RELEASE ;
ACTION { || ImgRotate(180,oBrowseImg) } ;
ACCELERATOR "1" ;
DISPLAYUP gBmpLoad("ROTAT180.BMU") ;
DISPLAYDN gBmpLoad("ROTAT180.BMD") ;
ATTACH aWinButtons
// -LLIBG- Show all buttons defined
SHOW ALL BUTTONS aWinButtons
// Main loop
WHILE lMore
IF !oBrowseImg:lIsStable .AND. NEXTKEY()==0
// Display image if not stable
ImgDynaDisplay(oBrowseImg)
ENDIF
IF oBrowseImg:lIsStable .AND. NEXTKEY()==0
// When the browse move, with K_UP,K_DOWN...
// we need to refresh scrollbars
// locations. Refresh only if no key pending
ScrBarUpDate(aHoriScroll,ImageHoriBar(NIL,NIL,oBrowseImg))
ScrBarUpDate(aVertScroll,ImageVertBar(NIL,NIL,oBrowseImg))
ENDIF
// Everything's done -- just wait for a key
nKey := mInkey( 0 , aWinButtons )
// -LLIBG- Use mInkey() instead of INKEY() and
// add aWinButtons allow buttons management
IF ( nKey == K_ESC )
// Esc means leave
lMore := .F.
ELSEIF ( nKey == K_BUTTON ) .OR. ;
( nKey == K_CLIC_OUT ) .OR. ;
( nKey == K_ACCELERATOR )
// -LLIBG- Warning, when a button is hitted, mInkey() give the hand
// back to main calling routine, and a value of K_BUTTON is
// returned. We must not apply this K_BUTTON to applyKey
// K_CLIC_OUT is returned when the clic does not match
// any button. K_ACCELERATOR is returned when an accelerator
// key have been striked
// We dont need to apply these keys
ELSE
// Apply the key to the ImageBrowse
EVAL( oBrowseImg:bApplyKey, oBrowseImg, nKey )
ENDIF
ENDDO
USE // Close database
// Erase VMM item
oBrowseImg:aDisPtr := iErase(oBrowseImg:aDisPtr)
oBrowseImg:aOriPtr := iErase(oBrowseImg:aOriPtr)
// General restoring
RESTSCREEN( nTop, nLeft, nBottom, nRight, xScreen)
SETCOLOR(cColorSave)
SETCURSOR(nCursoSave)
RETURN (NIL)
*
STATIC FUNCTION CreateGets(nRow ,; // Gets location in row/col
nCol ,; //
aGetButtons ; // Gets button handler
)
// Create gets for people file
LOCAL nGetRow := nRow
LOCAL nBoxRow := nRow
GetList := {}
// Create and display gets
@ nRow, nCol SAY "Name :" GET Name
@ ++nRow, nCol SAY "First :" GET FirstName
GetBox(nBoxRow,nCol,nRow,nCol+38,4,'Name')
nRow++
nBoxRow := nRow + 1
@ ++nRow, nCol SAY "Addr. :" GET Addr1
@ ++nRow, nCol SAY " " GET Addr2
@ ++nRow, nCol SAY "City :" GET City
@ ++nRow, nCol SAY "State :" GET State
@ ++nRow, nCol SAY "Country :" GET Country
@ ++nRow, nCol SAY "Zip :" GET Zip
@ ++nRow, nCol SAY "Phone :" GET Phone
GetBox(nBoxRow,nCol,nRow,nCol+31,4,'Adresse')
nRow := nGetRow+2
nBoxRow := nGetRow + 3
@ ++nRow, nCol+34 SAY "Size :" GET Size PICTURE '99999999' INCREMENTAL ATTACH aGetButtons
@ ++nRow, nCol+34 SAY "Born :" GET BirthDate INCREMENTAL ATTACH aGetButtons
@ ++nRow, nCol+34 SAY "Eyes :" GET Eyes RADIO 'Blue ','Green ','Brown ' ATTACH aGetButtons
nRow+=2
@ ++nRow, nCol+34 SAY "Hairs:" GET Hair RADIO 'Blond ','Brown ' ATTACH aGetButtons
GetBox(nBoxRow,nCol+34,nRow+1,nCol+50,4,'Misc')
GetBox(nGetRow,nCol,nRow+4,nCol+50,8,'')
// Add a "CANCEL" button to emulate K_ESC
@ (nCol+10) * FONT_SIZE_X ,;
(nRow+03) * FONT_SIZE_Y ,,;
BUTTON ;
STYLE BUTTON_TYPE_KEY ;
ACTION K_ESC ;
ACCELERATOR K_ALT_L ;
DISPLAYUP gBmpLoad("CANCEL.BMU") ;
DISPLAYDN gBmpLoad("CANCEL.BMD") ;
ATTACH aGetButtons
// Add a "OK" button to emulate K_PGDN
@ (nCol+30) * FONT_SIZE_X ,;
(nRow+03) * FONT_SIZE_Y ,,;
BUTTON ;
STYLE BUTTON_TYPE_KEY ;
ACTION K_PGDN ;
ACCELERATOR K_ALT_O ;
DISPLAYUP gBmpLoad("OK.BMU") ;
DISPLAYDN gBmpLoad("OK.BMD") ;
ATTACH aGetButtons
// Show all buttons connected to GET/READ
SHOW ALL BUTTONS aGetButtons
RETURN (NIL)
*
STATIC FUNCTION ReadGets(aGetButtons)
// Create gets for people file
READ SAVE BUTTONS aGetButtons
RETURN (NIL)
*
STATIC FUNCTION Skipper( nKey ,oBrowseImg, aGetButtons )
// Skip in DBF file
LOCAL nOldRec := RECNO() // Save recno to check real move
DO CASE
CASE nKey == K_HOME
DBGOTOP()
CASE nKey == K_DOWN .AND. !EOF()
DBSKIP(1)
IF EOF()
DBSKIP(-1)
ENDIF
CASE nKey == K_UP .AND. !BOF()
DBSKIP(-1)
CASE nKey == K_END
DBGOBOTTOM()
ENDCASE
IF nOldRec <> RECNO() // If we really move
// Redisplay Gets
AEVAL(GetList,{ |el| el:display() })
// Redisplay buttons linked to gets
SHOW ALL BUTTONS aGetButtons
// Load linked image
lLoadImgFile( oBrowseImg , ALLTRIM(IF(lIs256Color,IMAGE256,IMAGE016))+'.BMP' )
oBrowseImg:lIsStable := .F. // Image display is not stable
ENDIF
RETURN (NIL)